<?xml version="1.0" encoding="UTF-8"?>
<!--
    级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL
    日志输出规则 根据当前ROOT 级别，日志输出时，级别高于root默认的级别时 会输出
    以下 每个配置的 filter 是过滤掉输出文件里面，会出现高级别文件，依然出现低级别的日志信息，通过filter 过滤只记录本级别的日志
    scan 当此属性设置为true时，配置文件如果发生改变，将会被重新加载，默认值为true。
    scanPeriod 设置监测配置文件是否有修改的时间间隔，如果没有给出时间单位，默认单位是毫秒。当scan为true时，此属性生效。默认的时间间隔为1分钟。
    debug 当此属性设置为true时，将打印出logback内部日志信息，实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <springProperty scope="context" name="springAppName" source="spring.application.name" />
    <springProperty scope="context" name="logging.path" source="logging.path"/>
    <springProperty scope="context" name="logging.level.default" source="logging.level.default"/>
    <springProperty scope="context" name="logging.level.project" source="logging.level.project"/>
    <springProperty scope="context" name="logging.level.mybatis" source="logging.level.mybatis"/>


    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="logHomeDir" value="${r'${logging.path}'}"/>
    <property name="logPattern" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr([${r'${springAppName:-}'}]){blue} %clr(%-5level){faint} %clr([%thread]){magenta} %clr(%logger{50}){cyan} - %msg%n"/>
    <!-- 异步缓冲队列的深度,该值会影响性能.默认值为256-->
    <property name="queueSize" value="512"/>

    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符-->
            <pattern>${r'${logPattern}'}</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!--此日志appender是为开发使用，只配置最底级别，控制台输出的日志级别是大于或等于此级别的日志信息-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
    </appender>

    <!-- DEBUG日志配置 -->
    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${r'${logHomeDir}'}/${r'${springAppName}'}/${r'${springAppName}'}.log</file>
        <!-- 日志记录器的滚动策略，按日期，按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${r'${logHomeDir}'}/${r'${springAppName}'}/${r'${springAppName}'}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个文件最大为20MB -->
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>50MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <!-- 如果是 true，日志被追加到文件结尾，如果是 false，清空现存文件，默认是true。 -->
        <append>true</append>
        <!-- 日志文件的格式 -->
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>${r'${logPattern}'}</pattern>c
            <charset>utf-8</charset>
        </encoder>
        <!-- 过滤器，只记录INFO级别的日志 -->
        <!-- 果日志级别等于配置级别，过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 设置过滤级别 -->
            <level>DEBUG</level>
            <!-- 用于配置符合过滤条件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用于配置不符合过滤条件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="ASYNC_LOG_FILE" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
        <discardingThreshold>0</discardingThreshold>
        <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
        <queueSize>${r'${queueSize}'}</queueSize>
        <appender-ref ref="LOG_FILE"/>
    </appender>

    <logger name="com.apache.ibatis" level="${r'${logging.level.mybatis}'}"/>
    <logger name="java.sql.Connection" level="${r'${logging.level.mybatis}'}"/>
    <logger name="java.sql.Statement" level="${r'${logging.level.mybatis}'}"/>
    <logger name="java.sql.PreparedStatement" level="${r'${logging.level.mybatis}'}"/>
    <logger name="org.mybatis" level="${r'${logging.level.mybatis}'}"/>
    <logger name="com.shuang" level="${r'${logging.level.project}'}"/>

    <root level="${r'${logging.level.default}'}">
        <!-- appender referenced after it is defined -->
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="ASYNC_LOG_FILE"/>
    </root>

<!--    &lt;!&ndash;日志异步到数据库 &ndash;&gt;-->
<!--    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">-->
<!--        &lt;!&ndash;日志异步到数据库 &ndash;&gt;-->
<!--        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">-->
<!--            &lt;!&ndash;连接池 &ndash;&gt;-->
<!--            <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">-->
<!--                <driverClass>com.mysql.jdbc.Driver</driverClass>-->
<!--                <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>-->
<!--                <user>root</user>-->
<!--                <password>root</password>-->
<!--            </dataSource>-->
<!--        </connectionSource>-->
<!--    </appender>-->

</configuration>